
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>tmux 简介与使用</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="description" content="">
    <meta name="author" content="">

    <!-- Le styles -->
    <link href="styles/bootstrap.css" rel="stylesheet">
    <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.21/themes/black-tie/jquery-ui.css" rel="stylesheet">
    <link href="stylesheets/jquery.tocify.css" rel="stylesheet">
    <link href="styles/prettify.css" type="text/css" rel="stylesheet" />

    <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
    <!--[if lt IE 9]>
      <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
    <![endif]-->

    <!-- Le fav and touch icons -->
    <link rel="shortcut icon" href="../assets/ico/favicon.ico">
    <link rel="apple-touch-icon-precomposed" sizes="144x144" href="../assets/ico/apple-touch-icon-144-precomposed.png">
    <link rel="apple-touch-icon-precomposed" sizes="114x114" href="../assets/ico/apple-touch-icon-114-precomposed.png">
    <link rel="apple-touch-icon-precomposed" sizes="72x72" href="../assets/ico/apple-touch-icon-72-precomposed.png">
    <link rel="apple-touch-icon-precomposed" href="../assets/ico/apple-touch-icon-57-precomposed.png">
    <style>
    body {
      padding-top: 20px;
    }
    p {
      font-size: 16px;
    }
    .headerDoc {
      color: #005580;
    }

@media (max-width: 767px) {
    #toc {
        position: relative;
        width: 100%;
        margin: 0px 0px 20px 0px;
    }
}
    </style>
  </head>

  <body>

<a href="http://qfshare.com" target="_blank" id="fork-me"><img style="position: fixed;top: 0; right: 0; border: 0;z-index:999999;" src="imgs/copyright_of_qfshare.png" alt="Free to Distribute (qfhshare)" alt="Free to Distribute (qfhshare)"></a>

    <div class="container-fluid">
      <div class="row-fluid">
        <div class="span3">
          <div id="toc">
          </div><!--/.well -->
        </div><!--/span-->
        <div class="span9">
          <div class="hero-unit">
<h1>tmux 简介与使用</h1>
<h2>Description</h2>
            <div class="github-widget" data-repo="gfranko/jquery.tocify.js"></div>
            <br />
<p>tmux is a terminal multiplexer. It lets us use a single environment to launch multiple terminals, or windows, each running its own process or program.  For example, we can launch tmux and load up the Vim text editor. We can then create a new window, load up a database console, and switch back and forth between these programs all within a single session. If you use a modern operating system and a terminal that has tabs, this doesn’t sound like anything new. But running multiple programs simultaneously is only one of tmux’s features. We can divide windows into horizontal or vertical panes, which means we can run two or more programs on the same screen side by side. And we can do it all without using the mouse.</p>
          </div>

<!-- Content from MD -->
<h2>前言</h2>
<p>本文基本上是《tmux : Productive Mouse-Free Development (2012)》的一个缩减和强化版，缩减的意思就是去除了一些书中冗余和无关痛痒的一些描述，强化指的是加入了一些个人的使用心得和感受。</p>
<p>鼠标从发明的那天起，给图形界面交互以极大的方便，任何事物都有两面性，对于程序原来说使用鼠标无疑让你的操作都慢了一拍。</p>
<p>信息高速发达的今天，一个IT/IC从业人员都是要多线程工作的，我们并不像流水线上的工人，一个人永远只要做一件事情就可以了。比如我们也许有个Monitor程序在运行需要不时地关心下状态，还有个GVIM打开着编辑文件，还有个console开着看另外的report，还有...这样我们每天一大重大的事物就是切换窗口。tmux所做的事就是帮你把很多关注的点挪到一个界面来，就像现在在线系统的dashboard一样，可以任意组合你关注的东西到一个界面而不用随意切换。</p>
<p><img src="http://ebook.qfshare.com/imgs/tmux_01.png" alt="tmux overview" /></p>
<h3>screen 和 tmux</h3>
<p>或许很多人都有使用screen，screen可以说是tmux的精简版，有人喜欢功能齐全，有人喜欢简单直接，没有对错只有适合与不适合罢了。当你只需要一些attach，detach，多窗口管理这类基本功能时，screen这个工具足以，而当你需要像画画一样布局你的窗口，由script来控制各个窗口的行为等，那么screen就handle不了了，tmux是你的上上之选。</p>
<h3>tmux 是什么</h3>
<p>摘一段书上的原话</p>
<blockquote>
<p>tmux is a terminal multiplexer. It lets us use a single environment to launch multiple terminals, or windows, each running its own process or program.  For example, we can launch tmux and load up the Vim text editor. We can then create a new window, load up a database console, and switch back and forth between these programs all within a single session. If you use a modern operating system and a terminal that has tabs, this doesn’t sound like anything new. But running multiple programs simultaneously is only one of tmux’s features. We can divide windows into horizontal or vertical panes, which means we can run two or more programs on the same screen side by side. And we can do it all without using the mouse.</p>
<p>We can also detach from a session, meaning we can leave our environment running in the background. If you’ve used GNU-Screen before, you’re familiar with this feature. In many ways, tmux is like GNU-Screen with a lot of extra features, and a much simpler configuration system. And since tmux uses a client-server model, we can control windows and panes from a central location, or even jump between multiple sessions from a single terminal window. This client-server model also lets us create scripts and interact with tmux from other windows or applications.</p>
</blockquote>
<h3>约定</h3>
<ol>
<li>CTRL-b 意思为同时按住CTRL键和b键 “press the CTRL and b keys simultaneously.”</li>
<li>CTRL-R 意思是相同的，只不过此时你需要按住三个键，其中一个是SHIFT， &quot;the same thing, except that you’ll need to use the SHIFT key to produce the capital “R.” I won’t explicitly show the SHIFT key in any of these keystrokes.&quot;</li>
<li>CTRL-b d 意思是同时按住CTRL键和b键，释放这两个键，再按下d键 “press the CONTROL and b keys simultaneously, then release, and then press d.” </li>
</ol>
<hr />
<h2>tmux基础</h2>
<h3>Install tmux</h3>
<p>不同的系统安装方法也不一样，当然你也可以选择离线安装，将安装包下载到local，进行安装。很多场合下，你是没有root权限或者外网权限的，这个时候你就要将源文件拷贝到本地，进行本地安装。</p>
<h4>via package</h4>
<p>如果你使用的是Homebrew，可以使用如下命令获得。</p>
<pre><code>brew install tmux
</code></pre>

<p>如果你使用的是Ubuntu</p>
<pre><code>sudo apt-get install tmux
</code></pre>

<p>确保你已经安装了tmux，可使用命令来查看安装tmux的版本。</p>
<pre><code>tmux -V
</code></pre>

<h4>from source</h4>
<p>使用系统自带工具下载源包，或者到github上下载最新发布的tmux包，传到服务器，进行解压安装。</p>
<pre><code>$ tar -zxvf tmux-1.6.tar.gz
$ cd tmux-1.6
$ ./configure
$ make
$ sudo make install
</code></pre>

<h4>w/o root account</h4>
<p>我这里打了一个包，其中包括tmux和一般都需要的两个依赖软件，sh脚本将会帮你把tmux和其依赖包安装到~/local/bin里面，某些依赖library在~/local/lib里，tmux是基于BSD开源协议的，这个协议比较开放，可以用于商业目的，并且可以进行重新修改，打包销售，公司比较青睐于这类BSD协议的开源软件，可以放心在自己的体系内修改，使用而无法律问题。具体这个安装过程后续添加。</p>
<p>下载地址 <a href="http://pan.baidu.com/s/1c0mxspa" title="tmux 下载离线安装包">http://pan.baidu.com/s/1c0mxspa</a></p>
<h3>开始使用tmux</h3>
<h4>创建新的session</h4>
<pre><code>tmux new-session -s basic
</code></pre>

<p>可以简写为</p>
<pre><code>tmux new -s basic
</code></pre>

<p>退出tmux，直接退出当前terminal就退出了tmux</p>
<pre><code>exit
</code></pre>

<h4>Detach和Attach</h4>
<p>先介绍下命令前缀（command prefix），当我们运行tmux时，它其实是个terminal的管理工具，默认情况下我们所有的案件都是针对当前活跃的terminal的，如果要给tmux发命令怎么办呢？所以用到了command prefix，按下这个定义好的command prefix组合键，就进入了和tmux对话的状态，那么接下来的命令也好，快捷按键也好都是针对tmux的，与当前的呃terminal无关。tmux默认的command prefix是<strong><em>CTRL-b</em></strong>。这个是可以根据个人喜好习惯在配置文件里更改的，之后本文再提到针对tmux的命令需要先按下command prefix，直接使用 <strong><em>Prefix</em></strong> 字样。</p>
<p>Detach的操作是： <strong><em>CTRL-b d</em></strong> 之后文中都写成： <strong><em>Prefix d</em></strong></p>
<p>你可以通过命令来查看当前你有几个session存在。</p>
<pre><code>tmux ls
</code></pre>

<p>如果只有一个session存在，可以使用直接将seesion恢复到当前控制台。</p>
<pre><code>tmux attach
</code></pre>

<p>如果不止一个session，那么可以使用命令来恢复第一个session到当前控制台。</p>
<pre><code>tmux attach -t 1
</code></pre>

<p>session是不需要被Detach就可以attach到当前窗口的，便于分享和远程教学。</p>
<p>下面这个命令演示了在后台创建一个session，命名为second_session</p>
<pre><code>tmux new -s second_session -d
</code></pre>

<h4>kill session</h4>
<p>当session里的所有terminal都退出时，tmux就不复存在了，而如果我们想强制停止一个session，也是可以的。</p>
<pre><code>tmux kill-session -t second_session
</code></pre>

<h3>session， window 和 pane</h3>
<p>先上图，对着图我们可以看到用户面对的是tmux的session，而session中可以包含多个window，每个window又可以分成多个pane。如果用过screen，其实这些概念是类似的，screen起来的每一个实例叫做session，而screen可以开很多窗口，这些窗口就是window，每个窗口可以被split成左右两块（tmux可以任意分割），这两块每块我们称之为pane。</p>
<p><img src="http://ebook.qfshare.com/imgs/tmux_02.png" alt="session window and panel" /></p>
<h3>tmux中window的操作</h3>
<p>当我们创建一个session时候，自动创建一个window，我们可以创建任意多的window在一个session里。下面这个命令创建一个名为window的session，并将第一个window命名为shell。</p>
<pre><code>tmux new -s windows -n shell
</code></pre>

<h4>创建和重命名window</h4>
<p>在之前创建的session中，按下<strong><em>Prefix c</em></strong>，在新创建的窗口中运行top，这时窗口的名字变成了top，如果没有给window命名的话，window的名字是和当前运行的程序相关的。更改当前window的名字可以使用<strong><em>Prefix ，(a comma)</em></strong>。</p>
<h4>在window之间切换</h4>
<p>当你创建了多个窗口，需要在多个窗口之间切换时，可以使用快捷键<strong><em>Prefix n</em></strong>和<strong><em>Prefix p<strong><em>，意为next和previous。如果你的window是0-9的话，还可以使用</em></strong>Prefix 0</em></strong>，<strong><em>Prefix 1</em></strong>直到<strong><em>Prefix 9</em></strong>来切换窗口。</p>
<p>当窗口数目比较多时，可以使用<strong><em>Prefix f</em></strong>来根据名字查找，<strong><em>Prefix w</em></strong>列出一个所有window的菜单。</p>
<h4>退出window</h4>
<p>可以使用<strong><em>Prefix &amp;</em></strong>来退出当前window，或者直接使用exit命令。</p>
<h3>tmux中pane的使用</h3>
<p>pane可以将window窗口的layout布局分成多块，以达到多屏显示在一屏上的效果。默认地，分割窗口的时候都会从中间切开，<strong><em>Prefix %</em></strong>上下等分，<strong><em>Prefix &quot;<strong><em>左右等分。</em></strong>Prefix o</em></strong>可以在panes中间循环选择，<strong><em>Prefix {down}/{up}/{left}/{right}</em></strong>则可以上下左右地选择panes。</p>
<p>我们在配置文件里定义一些快捷键来resize pane，其中<strong><em>Prefix {space bar}</em></strong>可以微调pane的大小。</p>
<p>关闭一个pane，只要退出当前的terminal就可以了，或者可以使用<strong><em>Prefix X</em></strong>强制关闭当前pane。</p>
<h3>命令模式</h3>
<p>当进入tmux模式时，是可以通过命令来告诉tmux该做什么的。使用Prefix :来进入命令模式，之后你可以输入命令，比如</p>
<pre><code>new-window -n top &quot;top&quot;
</code></pre>

<p>这个命令的作用是在当前session内创建一个名为top的window，并且运行top命令，当你用q退出命令时，这个窗口也被关闭了，想要保留窗口可以通过设置，当然最好的方法还是新建一个不带初始命令的window，然后再切换到新窗口中去运行想要的命令。</p>
<hr />
<h2>配置tmux</h2>
<p>tmux默认的命令的键程都比较长，不是太友好，而且很多人都有自己的习惯，所以维护一个适合自己的configure文件，符合自己的习惯的这样一个文件还是比较有必要的。通过这些配置，你也可以更加深刻了解到tmux的方便之处。tmux首先回去找/etc/.tmux.conf这个文件，其次会去找home下的~/.tmux.conf文件，我们只要在自己的home下建立这个文件即可。</p>
<h3>重新定义Prefix</h3>
<p>默认的Prefix并不好使，有些人还是从screen转过来的，所以我希望能方便或者和我之前的习惯相同，下面set-option是对session作用的命令，可以简写为set，-g是global的意思，就是对所有session都起效。同时我们把默认的CTRL-b释放，以便可以在之后的配置中使用这个快捷键。unbind-key可以简写为unbind。</p>
<pre><code>set -g prefix C-a
unbind C-b
</code></pre>

<p>更改的配置文件需要对当前已经在运行的tmux起作用，需要重新source这个配置文件，按下<strong><em>Prefix :</em></strong>进入命令模式，输入以下命令。</p>
<pre><code>source-file ~/.tmux.conf
</code></pre>

<p>更改默认延迟，默认地，tmux会给命令发送到tmux给一个默认的delay，这个delay有时候并不是需要，而且不直观，可以将它改得足够小。</p>
<pre><code>set -sg escape-time 1
</code></pre>

<p>默认session和window的index都是从0开始的，这对切换窗口并不方便，所以我们把它更改成1，为保持一致性，我们把pane的index也改成从1开始。</p>
<pre><code>set -g base-index 1
setw -g pane-base-index 1
</code></pre>

<h3>自定义键值，命令和用户输入</h3>
<p>有很多键并不好记，也不好按，所以有重新定义的必要，除此之外，我们还需要做一些初始化的操作让我们的tmux更方便。</p>
<h4>reload configure</h4>
<p>首先，我们绑定一个快捷键来重新load .tmux.conf文件。现在我们可以通过快捷键<strong><em>Prefix r</em></strong>来重新load configure文件了，而不需要先按Prefix :进入命令模式，再输入source-file ~/.tmux.conf。</p>
<pre><code>bind r source-file ~/.tmux.conf
</code></pre>

<p>Reload全在内部进行，我们不知道是不是完成了，所以我们可以加个显性的display来告诉我们OK了。同一行内的多条命令使用<strong>\;</strong>做为分隔符。</p>
<pre><code>bind r source-file ~/.tmux.conf \; display &quot;Reloaded!&quot;
</code></pre>

<p>在使用screen的过程中，很多快捷键是不需要按Prefix就奏效的，tmux当然也可以，拿这个reload configure文件为例，我们只要在bind命令中加入-n选项，就可以跳过Prefix，只要直接按下CTRL-r就可以了。</p>
<pre><code>bind -n C-r source-file ~/.tmux.conf \; display &quot;Reloaded!&quot;
</code></pre>

<h4>send prefix key</h4>
<p>Prefix的快捷键难免会和所有的程序冲突，比如Vim，很多你当下应用的快捷键也会在Vim中用到，我们必须要定义一个机制把某些快捷键通过tmux发送给当前应用程序。</p>
<pre><code>bind C-a send-prefix
</code></pre>

<h4>split panes</h4>
<p>切割panes，由于-v和-h是split-window代表的是vertical和horizontal，对于tmux来说，vertical split意思为在当前活跃的pane之下创建一个pane，而horizontal split意思为在当前活跃pane的右边创建一个pane，所以我们形象地使用|和-来和我们的常规理解对应，|表示竖向分割，-表示横向分割。</p>
<pre><code>bind | split-window -h
bind - split-window -v
</code></pre>

<h4>movement panes</h4>
<p>在不同panes之间互相移动使用的是快捷键Prefix o，我们可以加入类似于Vim的映射。</p>
<pre><code>bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
</code></pre>

<p>此外，我们也可以使用Prefix CTRL-h和Prefix CTRL-l来循环选择。</p>
<pre><code>bind -r C-h select-window -t :-
bind -r C-l select-window -t :+
</code></pre>

<h4>resize panes</h4>
<p>可以进入命令模式，使用resize-pane -D 来使pane向下一个row，也可以-D后加个数值，这个体验并不好，我们把这些命令bind到一些快捷键上。</p>
<pre><code>bind H resize-pane -L 5
bind J resize-pane -D 5
bind K resize-pane -U 5
bind L resize-pane -R 5
</code></pre>

<p>当我们加了 -r选项以后，说明这个键是可以重复使用的，不用每次都先按下Prefix，再按具体的键，需要向下涨10，只要按下<strong><em>Prefix H H</em></strong>就可以了。</p>
<pre><code>bind -r H resize-pane -L 5
bind -r J resize-pane -D 5
bind -r K resize-pane -U 5
bind -r L resize-pane -R 5
</code></pre>

<p>repeat的时间可以用report-time来定义，默认是500 milliseconds。</p>
<h3>鼠标的使用</h3>
<p>一开始就说了，使用鼠标会降低我们的效率，但是我们还是可以让鼠标在tmux里工作，可以用来选择pane，resize pane，甚至选择window。</p>
<pre><code>setw -g mode-mouse on
set -g mouse-select-pane on
set -g mouse-resize-pane on
set -g mouse-select-window on
</code></pre>

<p>最好还是disable掉所有的mouse操作。</p>
<pre><code>setw -g mode-mouse off
set -g mouse-select-pane off
set -g mouse-resize-pane off
set -g mouse-select-window off
</code></pre>

<h3>更改颜色</h3>
<p>我们先要启动256色支持：</p>
<pre><code>set -g default-terminal &quot;screen-256color&quot;
</code></pre>

<p>改变状态栏的前景色和背景色：</p>
<pre><code>set -g status-fg white
set -g status-bg black
</code></pre>

<p>改变窗口列表的颜色，和当前活跃窗口的颜色：</p>
<pre><code>setw -g window-status-fg cyan
setw -g window-status-bg default
setw -g window-status-attr dim

setw -g window-status-current-fg white
setw -g window-status-current-bg red
setw -g window-status-current-attr bright
</code></pre>

<p>改变面板Pane的边界颜色，默认边界和活跃边界。</p>
<pre><code>set -g pane-border-fg color
set -g pane-border-bg color
set -g pane-active-border-fg color
set -g pane-active-border-bg color
</code></pre>

<p>我们还可以改变command line</p>
<pre><code>set -g message-fg white
set -g message-bg black
set -g message-attr bright
</code></pre>

<h3>配置Status Bar</h3>
<table>
<tbody>
<tr>
	<td>#H</td>
	<td>Hostname of local host</td>
</tr>
<tr>
	<td>#h</td>
	<td>Hostname of local host without the domain name</td>
</tr>
<tr>
	<td>#F</td>
	<td>Current window flag</td>
</tr>
<tr>
	<td>#I</td>
	<td>Current window index</td>
</tr>
<tr>
	<td>#P</td>
	<td>Current pane index</td>
</tr>
<tr>
	<td>#S</td>
	<td>Current session name</td>
</tr>
<tr>
	<td>#T</td>
	<td>Current window title</td>
</tr>
<tr>
	<td>#W</td>
	<td>Current window name</td>
</tr>
<tr>
	<td>##</td>
	<td>A literal #</td>
</tr>
<tr>
	<td>#(shell-command)</td>
	<td>First line of the shell command's output</td>
</tr>
<tr>
	<td>#[attributes]</td>
	<td>Color or attribute change</td>
</tr>
</tbody>
</table>
<p>例如</p>
<pre><code>set -g status-left &quot;#S&quot;
</code></pre>

<p>我们还可以给它加上颜色属性</p>
<pre><code>set -g status-left &quot;#[fg=green]#S&quot;
</code></pre>

<p>我们可以加入任意多的项，当default的字符宽度太短时，我们可以设置想要的宽度：</p>
<pre><code>set -g status-left-length 40
set -g status-left &quot;#[fg=green]#S #[fg=yellow]#I #[fg=cyan]#P&quot;
</code></pre>

<p>左边设好了，右边也可以设置</p>
<pre><code>set -g status-right &quot;#[fg=cyan]%d %b %R&quot;
</code></pre>

<p>最好设置status文字支持UTF-8字符</p>
<pre><code>set -g status-utf8 on
</code></pre>

<p>我们还可以利用现有的shell命令入uptime，或者自己写的shell脚本等加入到status bar中#(shell-command)。status bar默认是15s刷新一次，我们可以自己设定，shell commond也会相应地运行一次，例如</p>
<pre><code>set -g status-interval 60
</code></pre>

<p>window list默认是左对齐的，我们可以设置让它居中对齐。</p>
<pre><code>set -g status-justify centre
</code></pre>

<p>我们可以监控某个窗口的变化，当某个窗口变化了，比如一直在wait server，等了5分钟，server有返回值了，那么terminal上的输出就变化了，此时监控机制被激活，有activity的窗口就会变颜色。</p>
<pre><code>setw -g monitor-activity on
set -g visual-activity on
</code></pre>

<hr />
<h2>脚本化tmux环境</h2>
<p>完成一样工作可能要使用很多的tool，比如做PnR，需要打开text editor - Vim，需要打开Place &amp; Route 工具比如IC Compiler，需要打开StarRC，需要打开不同的report进行比较等等。</p>
<p>tmux有很多选项，我们可以通过-t (target)选项来对某个session发送命令，tmux session可以在detach状态，也可以在active状态。比如：</p>
<pre><code>tmux new-session -s development -d
tmux split-window -h -t development
tmux attach -t development
</code></pre>

<p>第一句话表示新建一个session，名为development，并且detach掉，第二句话表示对这个development的session横向分割窗口，第三句话把它attach回来看下是不是我们想要的效果。</p>
<pre><code>touch ~/development
chmod +x ~/development
mkdir ~/devproject
# in development file ; C-m means Control-M of Carriage Return
tmux send-keys -t development 'cd ~/devproject' C-m
tmux send-keys -t development 'vim' C-m
#tmux split-window -v -t development
tmux split-window -v -p 10 -t development
tmux select-layout -t development main-horizontal
</code></pre>

<p>前3句新建文件和目录，在文件里写入这些tmux内容，首先切换到devproject目录中，打开Vim，再将窗口分割出一个10%大小的部分在底部。</p>
<h3>发送命令到指定的window和pane</h3>
<p>window和pane都是有index的，所有我们可以通过index来索引到具体的window和pane。指定target的格式：[session]:[window].[pane]，比如：</p>
<pre><code>tmux send-keys -t development:1.2 'cd ~/devproject' C-m
</code></pre>

<p>下面这句话可以让我们attach development时，index是1的window是当前被显示的一个。</p>
<pre><code>tmux select-window -t development:1
tmux attach -t development
</code></pre>

<p>整个脚本如下</p>
<pre><code>tmux new-session -s development -n editor -d
tmux send-keys -t development 'cd ~/devproject' C-m
tmux send-keys -t development 'vim' C-m
tmux split-window -v -t development
tmux select-layout -t development main-horizontal
tmux send-keys -t development:1.2 'cd ~/devproject' C-m
tmux new-window -n console -t development
tmux send-keys -t development:2 'cd ~/devproject' C-m
tmux select-window -t development:1
tmux attach -t development
</code></pre>

<p>这些写在~/development里，最后只要在shell里run下这个脚本就可以了~/development。</p>
<p>加入has-session的控制，如果development这个session存在就直接attach，不然按照脚本创建并attach：
    tmux has-session -t development
    if [ $? != 0 ]
    then
    tmux new-session -s development -n editor -d
    tmux send-keys -t development 'cd ~/devproject' C-m
    tmux send-keys -t development 'vim' C-m
    tmux split-window -v -t development
    tmux select-layout -t development main-horizontal
    tmux send-keys -t development:1.2 'cd ~/devproject' C-m
    tmux new-window -n console -t development
    tmux send-keys -t development:2 'cd ~/devproject' C-m
    tmux select-window -t development:1
    fi
    tmux attach -t development</p>
<p>对于不同的project，需要独立的conf file，而不是统统加入到系统默认的tmux conf中去，例如我们可以创建一个proj.conf：</p>
<pre><code>source-file ~/.tmux.conf
new-session -s development -n editor -d
send-keys -t development 'cd ~/devproject' C-m
send-keys -t development 'vim' C-m
split-window -v -t development
select-layout -t development main-horizontal
send-keys -t development:1.1 'cd ~/devproject' C-m
new-window -n console -t development
send-keys -t development:2 'cd ~/devproject' C-m
select-window -t development:1
</code></pre>

<p>使用如下命令启动tmux</p>
<pre><code>tmux -f proj.conf attach
</code></pre>

<h3>使用第三方工具管理配置文件</h3>
<p>主要有teamocil和tmuxinator两个工具。</p>
<hr />
<h2>Text和buffer</h2>
<p>我们每天多数时间打交道的是文本，和screen一样，<strong><em>Prefix [</em></strong>进入复制模式，我们可以设置成vi模式或者emacs模式。</p>
<pre><code>setw -g mode-keys vi
</code></pre>

<p>在vi模式下，可以使用h,j,k和l来左下上右移动，按下Enter退出这个模式。同样可以使用w跳到下一个单词，b跳到前一个单词。使用f来跳转到同行下个相同字母，使用F往前找同行里的相同字母。可以使用CTRL-b和CTRL-f来进行上下翻页。还有试用g和G跳到顶部和底部。</p>
<p>如果要进行搜索，像vi里一样?和/，以及n和N都是work的。</p>
<p>那么怎样复制呢？首先将光标移动至初始位置，让后按下space键，移动光标到你想要复制文本的末尾，按下Enter键，选中的文字就被复制了。如果要粘贴，进入复制模式，然后<strong><em>Prefix ]</em></strong>就可以了。</p>
<p>有个命令可以复制整个pane的可见区域：</p>
<pre><code>capture-pane
</code></pre>

<p>我们还可以将buffe的内容显示出来以及保存起来。</p>
<pre><code>tmux capture-pane &amp;&amp; tmux save-buffer buffer.txt
</code></pre>

<p>多个buffer的例子：进入copy mode之后，多次进行选择，空格键复制，回车键释放，这样tmux就会将内容依次存入buffer内，可以使用list-buffer命令来查看。</p>
<p>如果使用习惯了一些vi的复制，粘贴快捷键：</p>
<pre><code>unbind [
bind Escape copy-mode
unbind p
bind p paste-buffer
bind -t vi-copy 'v' begin-selection
bind -t vi-copy 'y' copy-selection
</code></pre>

<hr />
<h2>工作流 （work Flow）</h2>
<h3>pane和window</h3>
<h3>管理session</h3>
<hr />
<h2>tmux 帮助文档</h2>
<p>From Open-BSD</p>
<p><a href="./tmux_man.html" title="tmux man from open-bsd">local tmux manual</a></p>
<p><a href="http://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man1/tmux.1" title="tmux manual from open-bsd">original web page</a></p>
<h2>我的 .tmux.conf</h2>
<p>.tmux.conf</p>
<h3>pane 的分隔符问题</h3>
<p>在我的putty登陆到服务器时，分隔符变成了横向是q，竖向是x，转折是u和v。google到的解释和解决办法：</p>
<blockquote>
<p>Per the VT100 User Guide, Table 3-9: Special Graphics Characters, when the “special graphics set” is selected, x is used to draw the “Vertical bar” and q is used to draw “Horizontal line - Scan 5”.</p>
<p>Under terminfo, the VT100 special graphics characters are available as a part of the Alternate Character Set functionality; see the “Line Graphics” section of the terminfo(5) man page.</p>
<p>Probably (on your Debian server) the effective terminfo database entry indicates that ACS is available, but your terminal emulator is not actually responding to the specified control sequences.</p>
<p>The tmux CHANGES file indicates that some terminal emulators (e.g. Putty) do not respect the ACS control sequences when they are in UTF-8 mode. Thus, tmux 1.4 has a change that makes it always use UTF-8 characters instead of ACS sequences when the attaching client specifies that it can handle UTF-8 (i.e. when attaching, -u was given or UTF-8 is present in LC_ALL, LC_CTYPE or LANG; the utf8 window option is about what tmux should expect from the programs it runs, not what it can send to the attached client).</p>
<p>Debian “squeeze” only includes tmux 1.3, so your tmux probably does not have the “prefer UTF-8 line drawing” feature (unless it pulls from a backports source).</p>
<p>If you can not fix your terminal emulator nor upgrade to at least tmux 1.4, then you might be able to use tmux’s terminal-overrides option to unset the ACS-related capabilities so that tmux will fall back to ASCII line drawing. In your .tmux.conf (on the Debian system):</p>
<p><code>set-option -ga terminal-overrides ',*:enacs@:smacs@:rmacs@:acsc@'</code></p>
</blockquote>
<p>再我加入上面这句话到配置文件里之后，果然好了。</p>
<hr />
<h2>脚本 Sample</h2>
<p>开始新的项目</p>
<p>连接不同工具</p>
<h2>PDF 版本</h2>
<p><a href="tmux.pdf" title="tmux简介 PDF version">tmux.pdf</a></p>

<!-- Content from MD End-->

        </div><!--/span-->
      </div><!--/row-->

    </div><!--/.fluid-container-->

    <!-- Le javascript
    ================================================== -->
    <!-- Placed at the end of the document so the pages load faster -->
    <script src="libs/jquery/jquery-1.8.3.min.js"></script>
    <script src="libs/jqueryui/jquery-ui-1.9.1.custom.min.js"></script>
    <script src="javascripts/bootstrap.js"></script>
    <script src="javascripts/jquery.tocify.js"></script>
    <script src="javascripts/prettify.js"></script>
    <script>
        $(function() {

            var toc = $("#toc").tocify({
              selectors: "h2,h3,h4,h5"
            }).data("toc-tocify");

            prettyPrint();
            $(".optionName").popover({ trigger: "hover" });

        });
    </script>

  </body>
</html>
